// Package api
// @Author: zhangdi
package sysctrl

import (
	"path/filepath"
	"server/application/db/system/columns"
	"server/application/db/system/dbdto"
	"server/application/db/system/dbsvc"
	"server/application/dto"
	"server/pkg/ginp"
	"server/pkg/myjwt"
	"server/pkg/where"
)

// @BasePath /api/v1

// @Summary 查询SQLTest服务配置
// @Description  查询SQLTest服务配置
// @Tags SQLTest
// @Accept  json
// @Produce  json
// @Param instance_mark query string true "节点标识"
// @Param start_time query int true "查询起始时间"
// @Param end_time query int true "查询结束时间"
// @Param user query string false "执行用户"
// @Param start_exec_time query int false "执行时长下限"
// @Param end_exec_time query int false "执行时长上限"
// @Param content query string false "SQL内容"
// @Param next_id query int false "下一页ID"
func Login(ctx *ginp.ContextPro) {
	var params *dto.ReqSysLogin
	if err := ctx.ShouldBindJSON(&params); err != nil {
		ctx.ErrJson("请求参数有误" + err.Error())
		return
	}

	user, err := dbsvc.UserLogin(params)
	if user == nil {
		ctx.ErrJson("账号或密码错误")
		return
	}

	if err != nil {
		ctx.ErrJson("登录失败：" + err.Error())
		return
	}

	//保存元数据信息
	myClaims := myjwt.MyClaims{
		Id:       user.ID,
		Username: user.Username,
	}

	//登录有效期15天
	token, _ := myjwt.GenToken(myClaims, 60*24*15)
	ctx.OkJsonData(dto.RespSysUserLogin{
		UserInfo:    user,
		AccessToken: token,
	})
}

// Register 注册
func Register(ctx *ginp.ContextPro) {
	//var params *comdto.UserDtoRegister
	//if err := ctx.ShouldBindJSON(&params); err != nil {
	//	ctx.ErrJson("请求参数有误" + err.Error())
	//	return
	//}
	//
	////检测验证码
	//if !dbservice.EmailCodeInstance().CheckCode(params.EmailCode) {
	//	ctx.ErrJson("邮箱验证码无效或已过期")
	//	return
	//}
	//
	//userInfo, err := dbservice.UserInstance().CreateUser(params)
	//if err != nil {
	//	ctx.ErrJson(err.Error())
	//	return
	//}
	//ctx.OkJsonData(userInfo)
}

// IsLogin 检测登录状态
func IsLogin(ctx *ginp.ContextPro) {
	var params dto.ReqSysIsLogin
	if err := ctx.ShouldBindJSON(&params); err != nil {
		ctx.ErrJson("请求参数有误" + err.Error())
		return
	}

	token := params.AccessToken
	_, err := myjwt.ParserToken(token)
	if err != nil {
		ctx.ErrJson(err.Error())
		return
	}

	userId := ctx.GetLoginUserId()
	userInfo, _ := dbsvc.SysUserFindOneByID(userId)
	ctx.OkJsonData(userInfo)

}

func SysUserCreate(ctx *ginp.ContextPro) {
	var params *dbdto.SysUserCreate
	if err := ctx.ShouldBindJSON(&params); err != nil {
		ctx.ErrJson("请求参数有误:" + err.Error())
		return
	}
	params.Creator = ctx.GetLoginUserId()
	info, err := dbsvc.SysUserCreate(params)
	if err != nil {
		ctx.ErrJson("创建失败:" + err.Error())
		return
	}
	ctx.OkJsonData(info)
}

func SysUserUpdate(ctx *ginp.ContextPro) {
	var params *dbdto.SysUserUpdate
	if err := ctx.ShouldBindJSON(&params); err != nil {
		ctx.ErrJson("请求参数有误" + err.Error())
		return
	}
	wheres := where.Format(where.OptEqual("id", params.ID))
	err := dbsvc.SysUserUpdate(wheres, params)
	if err != nil {
		ctx.ErrJson("修改失败" + err.Error())
		return
	}
	ctx.OkJson()
}

func SysUserDelete(ctx *ginp.ContextPro) {
	var params *dbdto.SysUserDelete
	if err := ctx.ShouldBindJSON(&params); err != nil {
		ctx.ErrJson("请求参数有误" + err.Error())
		return
	}
	err := dbsvc.SysUserDelete(where.FormatOne("id", "IN", params.ID))
	if err != nil {
		ctx.ErrJson("删除失败" + err.Error())
		return
	}
	ctx.OkJson()
	return
}

func SysUserSearch(ctx *ginp.ContextPro) {
	var params *dto.ReqSearch
	if err := ctx.ShouldBindJSON(&params); err != nil {
		ctx.ErrJson("请求参数有误" + err.Error())
		return
	}
	//只能查看自己创建的用户
	if !dbsvc.SysUserIsSuperAdmin(ctx.GetLoginUserId()) {
		params.Wheres = append(params.Wheres, where.Opt(columns.SysUserCreator, "=", ctx.GetLoginUserId()))
	}

	list, total := dbsvc.SysUserSearch(params.Wheres, params.Extra)
	resp := &dto.RespSearch{
		List:     list,
		Total:    uint(total),
		PageNum:  uint(params.Extra.PageNum),
		PageSize: uint(params.Extra.PageSize),
	}
	ctx.OkJsonData(resp)

}

// SysUserUpdatePwd 修改密码
func SysUserUpdatePwd(ctx *ginp.ContextPro) {
	var params *dto.DtoSysUserUpdatePwd
	if err := ctx.ShouldBindJSON(&params); err != nil {
		ctx.ErrJson("请求参数有误" + err.Error())
		return
	}
	uid := ctx.GetLoginUserId()
	err := dbsvc.SysUserUpdatePwd(params.Password, uid)
	if err != nil {
		ctx.ErrJson("修改失败" + err.Error())
	}
	ctx.OkJson()
}

// SysUserImport 导入excel文件
func SysUserImport(ctx *ginp.ContextPro) {
	// 单个文件
	file, err := ctx.FormFile("file")
	if err != nil {
		ctx.ErrJson(err.Error())
		return
	}

	// 保存文件
	filePath := "./uploads/import/" + file.Filename
	err = ctx.SaveUploadedFile(file, filePath)
	if err != nil {
		ctx.ErrJson(err.Error())
		return

	}
	isCover := true //冲突时覆盖
	isCoverStr := ctx.PostForm("isCover")
	if isCoverStr == "false" {
		isCover = false //冲突时覆盖
	}

	err = dbsvc.SysUserImportData(filePath, isCover)
	if err != nil {
		ctx.ErrJson("导入失败，请检excel格式是否正确：" + err.Error())
		return
	}
	//返回成功
	ctx.OkJson()
}

// SysUserImportTemplateFile 获取导入的模板文件
func SysUserImportTemplateFile(ctx *ginp.ContextPro) {
	filePath, err := dbsvc.SaveImportTemplateFile(dbdto.SysUserCreate{}, "sys_user")
	if err != nil {
		ctx.ErrJson(err.Error())
		return
	}
	ctx.FileAttachment(filePath, "template_sys_user.xlsx")
}

// SysUserExport 导出数据
func SysUserExport(ctx *ginp.ContextPro) {
	var params *dto.ReqSearch
	if err := ctx.ShouldBindJSON(&params); err != nil {
		ctx.ErrJson("请求参数有误:" + err.Error())
		return
	}
	file_path, err := dbsvc.SysUserExportData(params)
	if err != nil {
		ctx.ErrJson("导出失败:" + err.Error())
		return
	}
	ctx.FileAttachment(file_path, filepath.Base(file_path))
}
